//
//  YLIAPProcessor.swift
//  YLPaymentKit
//
//  Created by changhe on 2025/4/12.
//

import Foundation
import StoreKit
import UIKit

/// 内购支付处理器
internal class YLIAPProcessor: NSObject, YLPaymentProcessor {
    
    // MARK: - 属性
    
    /// 支付类型
    var paymentType: YLPaymentType {
        return .iap
    }
    
    /// 是否可用（检查是否可以进行支付）
    var isAvailable: Bool {
        return true // 总是可用
    }
    
    /// StoreKit管理器
    private var storeKitManager: YLStoreKitManagerProtocol
    
    /// 当前使用的IAP版本
    private var iapVersion: YLIAPVersion
    
    /// 交易更新回调
    private var transactionUpdatedCallback: ((YLTransactionInfo) -> Void)?
    
    // MARK: - 初始化
    
    /// 初始化
    override public init() {
        // 默认不指定版本，使用YLPaymentManager中从配置传递的版本
        self.iapVersion = .auto
        self.storeKitManager = YLStoreKitManager.createManager(version: self.iapVersion)
        super.init()
    }
    
    /// 使用指定版本初始化
    init(version: YLIAPVersion) {
        // 保存版本信息
        self.iapVersion = version
        // 根据指定版本创建管理器
        self.storeKitManager = YLStoreKitManager.createManager(version: version)
        super.init()
    }
    
    // MARK: - 支付处理器协议实现
    
    /// 设置处理器
    public func setup(config: YLPaymentConfig) {
        // 从配置中获取IAP版本
        self.iapVersion = config.iapVersion
        
        // 根据配置创建StoreKit管理器
        self.storeKitManager = YLStoreKitManager.createManager(version: config.iapVersion)
    }
    
    /// 处理支付
    public func handlePayment(params: YLPaymentParams, completion: @escaping (YLPaymentResult) -> Void) {
        // 检查参数类型
        guard let iapParams = params as? YLIAPParams else {
            completion(.failure(.invalidParameters))
            return
        }
        
        // 从参数中提取必要信息
        let productId = iapParams.productId
        let orderId = iapParams.orderId
        
        // 使用storeKitManager进行购买
        storeKitManager.purchase(productId: productId, orderId: orderId, completion: completion)
    }
    
    /// 恢复购买
    func restorePurchases(completion: @escaping (YLPaymentResult) -> Void) {
        // 直接使用storeKitManager恢复购买，始终使用初始化时指定的版本
        storeKitManager.restorePurchases(completion: completion)
    }
    
    /// 能否处理URL
    func canHandleURL(_ url: URL) -> Bool {
        // 内购不处理URL回调
        return false
    }
    
    /// 处理URL回调
    func handleURL(_ url: URL) -> Bool {
        // 内购不处理URL回调
        return false
    }
    
    // MARK: - 其他公共方法
    
    /// 完成交易
    func finishTransaction(_ transaction: Any) {
        storeKitManager.finishTransaction(transaction)
    }
    
    /// 发起退款请求
    @available(iOS 15.0, *)
    func beginRefundRequest(for transactionId: UInt64, in scene: UIWindowScene) async throws -> Transaction.RefundRequestStatus {
        if let manager = storeKitManager as? YLStoreKitV2Manager {
            return try await manager.beginRefundRequest(for: transactionId, in: scene)
        }
        throw YLPaymentError.other("StoreKit 2管理器不可用")
    }
    
    /// 检查未完成的交易
    func checkUnfinishedTransactions(completHandler: (([YLTransactionInfo])-> Void)?) {
        storeKitManager.checkUnfinishedTransactions(completHandler: completHandler)
    }
    
    /// 获取商品信息
    func fetchProducts(productIds: [String], completion: @escaping (Result<[Any], Error>) -> Void) {
        storeKitManager.fetchProducts(productIds: productIds, completion: completion)
    }

}
